home *** CD-ROM | disk | FTP | other *** search
- ⓪ MODULE MM2Make;⓪ (*$Z+,R-*)⓪ ⓪ (*⓪!to do:⓪ ⓪!- beim suchen nach codes auch den comp-pfad der shell-option-box berück-⓪#sichtigen!⓪ ⓪!- option f. make & build, ob die output-pfade bestimmt werden sollen⓪#oder nicht. außerdem fehlende output-pfade ggf. hervorheben⓪ ⓪!- compiler muß per option (z.b. $O <name>) output-path auswerten⓪ ⓪!- die vierfachen langen procs, wie z.b. GetSrcTimes, zusammenfassen⓪ *)⓪ ⓪ (*----------------------------------------------------------------------------⓪!* Make-Utility für Megamax Modula-2⓪!*⓪!* Liest eine Make-Datei (als Argument zu übergeben, ansonsten in der⓪!* Shell einzustellen) ein, die alle Import-Abhängigkeiten eines⓪!* Projekts beschreibt und compiliert anhand der Zeitangaben der⓪!* Textdateien und der zugehörigen Codedateien alle veränderten⓪!* Module neu.⓪!*⓪!* In der Argumentzeile kann auch "-B" für "Build" übergeben werden.⓪!*⓪!* Exitcodes:⓪!* 0: Es sind Module zu compilieren⓪!* 1: Alle Module sind bereits korrekt compiliert⓪!* 2: Es sind Syntax-Fehler aufgetreten⓪!* 3: Es sind allg. Fehler aufgetreten⓪!*⓪!* Das Format der Make-Datei:⓪!* Am Anfang einer Zeile steht ein Modulname , dann entweder '-DEF',⓪!* '-IMP' oder '-MOD'. Dann folgen der Codedateiname und, falls, vorhanden,⓪!* der Quelldateiname. Ist der Quelltext vorhanden, folgt '-SOURCE' und⓪!* der Name der Quelltextdatei. Gibt es zum Quelltext Includedateien, so⓪!* werden diese nach -INC aufgezählt. Die Liste wird durch einen einzelnen⓪!* Strichpunkt abgeschlossen. Werden andere Module importiert, müssen⓪!* sie mit '-IMPORT' eingeleitet werden, dann folgen die importierten⓪!* Modulnamen. Das Ende der Importnamen muß durch einen einzelnen Strich-⓪!* punkt angegeben werden. Sind andere Dateien abhängig (z.B RSC-Dateien),⓪!* sind sie mit -USES aufzuzählen (wie Importe und Include-Dateien).⓪!* Die importierten Modulnamen müssen alle nochmal irgendwo in der Datei⓪!* mit "<Modulname> -DEF <Codedateiname> -IMP <Codedateiname>" aufgeführt⓪!* werden!⓪!* Ein Implementationsmodul, das kein DEF zur Prüfung braucht (als⓪!* Hauptmodul, beispielsweise Treiber, wie GEMIO), wird mit '-IMPMOD'⓪!* eingeleitet.⓪!* Wenn bei einem Dateinamen kein Pfad angegeben ist, wird auf den von⓪!* Shell und Compiler benutzten Pfaden (siehe Modul 'ShellMsg') gesucht⓪!* (bei Includes wird auf den Source-Pfaden, bei USES auf den StdPaths⓪!* "DefaultPath" gesucht).⓪!*⓪!* Beispiel für eine Make-Datei:⓪!*⓪!* Test -MAIN⓪!* -MOD D:\TEST.MOD⓪!* -SOURCE D:\TEST.M⓪!* -IMPORT InOut MyUtility;⓪!* -USES D:\TEST.RSC⓪!* MyUtility -IMP D:\CODES.IMP\MyUtil.IMP⓪!* -SOURCE D:\MyUtil.I⓪!* -INC D:\MyUtil.H ;⓪!* -IMPORT TimeConvert⓪!* Clock⓪!* ;⓪!* -DEF D:\CODES.DEF\MyUtil.DEF⓪!* -SOURCE D:\MyUtil.D⓪!* -IMPORT Clock ;⓪!* TimeConvert -DEF TIMECONV.DEF (* IMP unnötig, wenn kein Source *)⓪!* -NOSRC (* anzeigen, daß kein Source vorhand.*)⓪!* Clock -DEF CLOCK.DEF⓪!* -NOSRC⓪!* -IMP CLOCK.IMP⓪!* -NOSRC⓪!* MyIO -IMPMOD MYIO.IMP (* benötigt kein -DEF *)⓪!* -SOURCE MYIO.I⓪!*⓪!*----------------------------------------------------------------------------⓪!* TT : Thomas Tempelmann⓪!* CD : Christian Drießle⓪!*----------------------------------------------------------------------------⓪!* Datum Version Autor Bemerkung (Arbeitsbericht)⓪!*----------------------------------------------------------------------------⓪!* 02.03.88 1.0 TT Grundversion⓪!* 03.03.89 CD Ermöglicht, daß zu einem Modul IMP und DEF erlaubt⓪!* sind.⓪!* 04.03.89 CD Rekursiven Modulbaum-durchsuch-algorithmus erprobt.⓪!* 05.03.89 CD Alle Files in 5 Listen verteilt:⓪!* - ModCodes⓪!* - DefCodes⓪!* - ImpCodes⓪!* - Sources⓪!* - withPath (Files mit ausdrücklich angegebenem⓪!* Pfadnamen)⓪!* Die Files dieser Listen werden Pfadweise nachein-⓪!* einander gesucht und die Zeit eingelesen.⓪!* 07.03.89 CD Neue Errungenschaften vom 5.3. getestet und⓪!* korrigiert.⓪!* Nachfrage bei fehlendem Code und vorhandenem⓪!* Source.⓪!* IMP mit Source aber ohne IMPORT geht jetzt auch⓪!* am Ende der Makedatei.⓪!* Rekursive Suche durch den Modulbaum implementiert⓪!* mit markieren der zu übersetzenden Dateien.⓪!* Suche auch im Defaultpfad nach allen Sorten von⓪!* Dateien.⓪!* 08.03.89 1.01 CD Include-Dateien können angegeben werden und sie⓪!* werden berücksichtigt.⓪!* Es wird eine Datei mit Include-Anweisungen für⓪!* den Compiler erzeugt.⓪!* 09.03.89 CD toMoment berichigt ( * $10000L), bei nicht ge⓪!* gefundenem Code wird date und time auf 0 gesetzt.⓪!* 08.08.89 TT lauffähige Version fertiggestellt⓪!* 19.08.89 TT "-MAIN"-ID neu; bei Fehler wird TextName, TextLine⓪!* und TextCol gesetzt; bei Erfolg wird CodeName⓪!* nach -MAIN gesetzt; MakeFileName importiert⓪!* 19.08.89 TT TemporaryPath statt M2Home verwendet⓪!* 20.09.89 TT Nur erster MAIN-Name wird nach CodeName übernommen.⓪!* 09.01.90 TT Test-Funktion showIdents zeigt bei Importen deren⓪!* Modul- statt Code-Namen an⓪!* 18.01.90 1.2 TT Wenn Pfad angegeben, wird trotzdem auch auf den⓪!* anderen Such-Pfaden gesucht⓪!* 04.03.90 TT Durch '-NOSRC' wird keine Sourceangabe mehr⓪!* verlangt, wenn nur Code angegeben werden soll.⓪!* 11.03.90 1.3 TT Meckert bei -NOSRC nicht mehr über falsches Datum.⓪!* Noch zu tun: Bei IMP meckert er u.U. (wenn DEF⓪!* neu ist) über Datum, außerdem wird bei Nichtangabe⓪!* des IMP dann nicht erkannt, daß Clients neu⓪!* compiliert werden müssen.⓪!* 08.05.90 TT 'ignoreSource'-Abfrage in 'chkDate' entfernt.⓪!* 20.07.90 TT "-B" für Build eingebaut⓪!* 23.07.90 TT Vielleicht werden fehlende Sources nun korrekt⓪!* bemängelt.⓪!* 18.08.90 TT Noch ein paar ReplaceHome-Aufrufe eingefügt.⓪!* 10.11.90 TT $R-, $Z+⓪!* 28.11.90 TT Syntax-Fehler besser erkannt und ausführlichere⓪!* Fehlermeldung; Nun wird entw. -SOURCE oder -NOSRC⓪!* verlangt. Bei "NOSRC" und fehlendem Code wird nun⓪!* der Fehler korrekt gemeldet.⓪!* 19.02.91 1.4 TT In Outfile steht nun jew. einer der Clienten, der⓪!* die Übersetzung erzwingt.⓪!* 15.03.91 TT "-BI" für BuildImp (nur Implementations) eingebaut⓪!* 25.04.91 TT Reason bei Includes/Uses wird korrekt angegeben.⓪!*----------------------------------------------------------------------------⓪!*)⓪ ⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR;⓪ ⓪ FROM ArgCV IMPORT InitArgCV, PtrArgStr;⓪ ⓪ FROM InOut IMPORT⓪(FlushKbd, GotoXY, WriteLn, WriteString, Write, Read, ReadString,⓪(WriteInt, WriteCard, BusyRead, KeyPressed;⓪ ⓪ FROM Directory IMPORT⓪(GetDirEntry, DirQuery, DirEntry;⓪ ⓪ FROM FileNames IMPORT⓪(ValidatePath, ConcatPath, SplitPath;⓪ ⓪ FROM MOSGlobals IMPORT FileStr;⓪ ⓪ FROM Clock IMPORT⓪(CurrentDate, CurrentTime, PackDate, PackTime,⓪(UnpackDate, UnpackTime, Date, Time;⓪ ⓪ FROM TimeConvert IMPORT⓪(TimeToText, DateToText;⓪ ⓪ FROM Files IMPORT⓪(File, Access, Open, State, GetStateMsg, ResetState, Close, EOF,⓪(SetDateTime, GetDateTime, Create, ReplaceMode, Remove;⓪ ⓪ IMPORT Text;⓪ ⓪ FROM PathEnv IMPORT⓪(HomePath, ReplaceHome, HomeReplaced;⓪ FROM Paths IMPORT⓪(SearchFile, ListPos;⓪ FROM PathCtrl IMPORT⓪(PathList, PathEntry;⓪ ⓪ FROM ShellMsg IMPORT⓪(CodeName, TextName, TextLine, TextCol, ModuleName, ErrorMsg, Active,⓪(ShellPath, MakeFileName, ModPaths, DefPaths, ImpPaths, SrcPaths,⓪(TemporaryPath;⓪ ⓪ FROM Lists IMPORT⓪(List, LCarrier, CreateList, AppendEntry, InsertEntry, NextEntry,⓪(ScanEntries, LDir, LCondProc, ResetList, RemoveEntry, ListEmpty;⓪ ⓪ IMPORT Storage;⓪ ⓪ FROM Storage IMPORT⓪(DEALLOCATE;⓪ ⓪ FROM PrgCtrl IMPORT⓪(TermProcess;⓪ ⓪ FROM Strings IMPORT⓪(Empty, StrEqual, Upper, Insert, Copy, Length, Pos, PosLen, String,⓪(Split, EatSpaces, Assign, Concat, Append, Delete;⓪ ⓪ IMPORT FastStrings, FuncStrings;⓪ ⓪ TYPE⓪(CharSet = SET OF CHAR;⓪ ⓪ CONST⓪(titl1 = ' MM2Make V1.4 für Megamax Modula-2';⓪(titl2 = ' Erstellt 3/1989 von Thomas Tempelmann & Christian Drießle';⓪(noMem = 'Zu wenig Speicher!';⓪(noFile= 'Make-Datei ist leer!';⓪(readng= 'Lese ';⓪(scanin= 'Prüfe Dateien';⓪(datErr= ' hat ungültiges Datum!';⓪(toComp= 'Der Compiler wartet schon...';⓪(noComp= 'Alles OK';⓪(filErr= 'Dateifehler: ';⓪(dblid = 'Modul ist doppelt deklariert!';⓪(notDef= ' wurde nicht oder unvollständig deklariert!';⓪(opnErr= 'Datei(en) nicht gefunden!';⓪(noCom = 'Ausgabedatei konnte nicht angelegt werden! (Stimmt "Temp.Pfad"?)';⓪(synErr= 'Syntaxfehler: ';⓪(nameExp='Modulname erwartet.';⓪(fileExp='Dateiname erwartet.';⓪(typeExp='Modulkennung (DEF/IMP/MOD) erwartet.';⓪(srcExp ='Source-Kennung (SOURCE/NOSRC) erwartet.';⓪(srcnExp='Quelltextname erwartet.';⓪(remErr= 'Remove in Liste haut nicht hin!';⓪(eoprg = 'Programmende. Taste drücken...';⓪(NoCodeMsg = 'No Code';⓪(SelfMsg = 'Modified';⓪ ⓪(maybe = CharSet {'j', 'J', 'n', 'N'};⓪(no = CharSet {'n', 'N'};⓪(⓪(compFileName = 'MAKE.M2C'; (* temp.File f. Compiler, nach ShellMsg *)⓪ ⓪ TYPE⓪(FileType= (def, imp, mod, src, inc, uses);⓪(ModType = [def..mod];⓪ ⓪(ImpList = POINTER TO ImpDesc;⓪(IncList = POINTER TO IncDesc;⓪(PtrMod = POINTER TO ModDesc;⓪(⓪(ImpDesc = RECORD⓪4next: ImpList;⓪4modPtr : PtrMod⓪2END;⓪(⓪(IncDesc = RECORD⓪4fullname: ARRAY [0..80] OF CHAR;⓪4date, time : CARDINAL;⓪4next : IncList;⓪2END;⓪ ⓪(ModDesc = RECORD⓪4name: String;⓪4type: ModType;⓪4codeName: String;⓪4date, time: CARDINAL;⓪4checked: BOOLEAN;⓪4ignore: BOOLEAN;⓪4CASE withSource: BOOLEAN OF⓪6TRUE: sourceName: String;⓪<sdate, stime: CARDINAL;⓪<uses, include : IncList;⓪<import: ImpList;⓪4| FALSE: ignoreSource: BOOLEAN;⓪4END⓪2END;⓪ ⓪(moment = LONGCARD;⓪ ⓪ ⓪ VAR⓪(build, buildImp, waitAtEnd, ok, error: BOOLEAN;⓪(exitCode: INTEGER;⓪(f, compfile : File;⓪(modlist: List; (* OF ModDesc *)⓪ ⓪ (*!TT*)⓪ PROCEDURE term3 (REF s: ARRAY OF CHAR);⓪"VAR c:CHAR;⓪"BEGIN⓪$WriteLn;⓪$WriteString (s);⓪$WriteLn;⓪$WriteLn;⓪$WriteString (eoprg);⓪$FlushKbd;⓪$Read (c);⓪$ResetState (f);⓪$Close (f);⓪$TermProcess (3)⓪"END term3;⓪ ⓪ (*!TT*)⓪ PROCEDURE termNoMem;⓪"BEGIN⓪$term3 (noMem);⓪"END termNoMem;⓪ ⓪ PROCEDURE term (s: ARRAY OF CHAR);⓪"VAR c:CHAR;⓪"BEGIN⓪$(*!TT*)⓪$IF Active THEN⓪&FastStrings.Assign (s, ErrorMsg);⓪$ELSE⓪&WriteLn;⓪&WriteString (s);⓪&WriteLn;⓪&WriteLn;⓪&WriteString (eoprg);⓪&FlushKbd;⓪&Read (c);⓪$END;⓪$ResetState (f);⓪$Close (f);⓪$TermProcess (2)⓪"END term;⓪ ⓪ ⓪ PROCEDURE ALLOCATE (VAR p:ADDRESS; l:LONGCARD);⓪"BEGIN⓪$Storage.ALLOCATE (p,l);⓪$IF p=NIL THEN termNoMem END⓪"END ALLOCATE;⓪ ⓪ (*$Z-*)⓪ PROCEDURE chkavail (d1, d2: ADDRESS): BOOLEAN;⓪ (*$Z=*)⓪"VAR actmod: PtrMod; chkmod: POINTER TO PtrMod; eq: BOOLEAN;⓪"(*$L-*)⓪"BEGIN⓪$(*⓪&actmod:= d1;⓪&chkmod:= d2;⓪&eq:= (actmod^.type = chkmod^^.type)⓪)& StrEqual (actmod^.name, chkmod^^.name);⓪&IF eq THEN chkmod^:= actmod END;⓪&RETURN eq⓪$*)⓪$ASSEMBLER⓪(MOVE.L -(A3),A2 ; d2⓪(MOVE.L A2,-(A7)⓪(MOVE.L (A2),A2 ; A2: chkmod⓪(MOVE.L -(A3),A1 ; A1: actmod⓪(MOVE.W ModDesc.type(A1),D0⓪(CMP.W ModDesc.type(A2),D0⓪(BNE neq⓪(MOVE.B ModDesc.name(A1),D0⓪(CMP.B ModDesc.name(A2),D0⓪(BNE neq⓪(LEA ModDesc.name(A1),A0⓪(MOVE.L A0,(A3)+⓪(MOVE #79,(A3)+⓪(LEA ModDesc.name(A2),A0⓪(MOVE.L A0,(A3)+⓪(MOVE #79,(A3)+⓪(MOVE.L A1,-(A7)⓪(JSR StrEqual⓪(MOVE.L (A7)+,A1⓪(TST -(A3)⓪(BEQ neq⓪(MOVE.L (A7)+,A2⓪(MOVE.L A1,(A2)⓪(MOVE #1,(A3)+⓪(RTS⓪&neq⓪(ADDQ.L #4,A7⓪(CLR (A3)+⓪$END⓪"END chkavail;⓪"(*$L=*)⓪ ⓪ PROCEDURE avail (VAR s: ARRAY OF CHAR; t: ModType; VAR modp: PtrMod): BOOLEAN;⓪"VAR mod: ModDesc; found: BOOLEAN;⓪"BEGIN⓪$Assign (s, mod.name, ok);⓪$mod.type:= t;⓪$modp:= ADR (mod);⓪$ResetList (modlist);⓪$ScanEntries (modlist, forward, chkavail, ADR (modp), found);⓪$RETURN found⓪"END avail;⓪ ⓪ PROCEDURE newMod (VAR s: ARRAY OF CHAR; t: ModType; VAR actmod: PtrMod);⓪"BEGIN⓪$NEW (actmod);⓪$AppendEntry (modlist, actmod, error);⓪$IF error THEN termNoMem END;⓪$WITH actmod^ DO⓪&Assign (s, name, ok);⓪&type:= t;⓪&codeName:= '';⓪&checked:= FALSE;⓪&ignore:= FALSE;⓪&withSource:= FALSE;⓪$END⓪"END newMod;⓪ ⓪ ⓪ PROCEDURE readIdents (makename: ARRAY OF CHAR);⓪ ⓪"VAR⓪(path: PathList;⓪(fname: FileStr;⓪(id: String;⓪(line: ARRAY [0..256] OF CHAR;⓪(lineLen: CARDINAL;⓪(actmod: PtrMod;⓪ ⓪"PROCEDURE syntaxError(REF s: ARRAY OF CHAR);⓪$BEGIN⓪&WriteLn;⓪&WriteString (line);⓪&WriteLn;⓪&WriteString ('id: <');⓪&WriteString (id);⓪&Write ('>');⓪&WriteLn;⓪&DEC (TextCol, Length (id));⓪&term (FuncStrings.ConcStr (synErr, s))⓪$END syntaxError;⓪ ⓪"PROCEDURE checkState;⓪$VAR s: String;⓪$BEGIN⓪&IF State (f) < 0 THEN⓪(GetStateMsg (State (f), s);⓪(Insert (filErr, 0, s, ok);⓪(term3 (s)⓪&END⓪$END checkState;⓪"⓪"PROCEDURE getIdent (VAR s: ARRAY OF CHAR): BOOLEAN;⓪$(* Liefert in 's' das nächste Wort aus der Datei 'f'. *)⓪$VAR p: CARDINAL;⓪$⓪$BEGIN⓪&LOOP⓪(IF TextCol >= lineLen THEN⓪*IF EOF (f) THEN⓪,s[0]:= 0C;⓪,RETURN FALSE⓪*END;⓪*INC (TextLine);⓪*Text.ReadString (f, line);⓪*TextCol:= 0;⓪*IF line [0] = '*' THEN (* Kommentar *)⓪,line:= ''⓪*END;⓪*lineLen:= FastStrings.Length (line);⓪(END;⓪(ASSEMBLER⓪0; WHILE char (line, TextCol) = ' ' DO INC (TextCol) END;⓪0MOVE.L (A6),A0⓪0MOVE.W TextCol,D0⓪0MOVE.W lineLen(A0),D1⓪0LEA line(A0),A1⓪0MOVE.W D1,D2⓪.again⓪0CMP.W D1,D0⓪0BCC ende⓪0CMPI.B #' ',0(A1,D0.W)⓪0BNE cont⓪0ADDQ.W #1,D0⓪0BRA again⓪.cont⓪0MOVE D0,-(A7)⓪0ADDQ.W #1,D0⓪.aga2⓪0CMP.W D1,D0⓪0BCC end2⓪0CMPI.B #' ',0(A1,D0.W)⓪0BEQ end3⓪0ADDQ.W #1,D0⓪0BRA aga2⓪.end3⓪0MOVE D0,D2⓪.end2⓪0MOVE (A7)+,D0⓪.ende⓪0MOVE.W D0,TextCol⓪0SUB.W D0,D2⓪0MOVE.W D2,p(A6)⓪(END;⓪(IF p>0 THEN⓪*FastStrings.Copy (line, TextCol, p, s);⓪*INC (TextCol, p);⓪*RETURN TRUE⓪(END;⓪&END (* LOOP *)⓪$END getIdent;⓪ ⓪"PROCEDURE newUse (name : ARRAY OF CHAR);⓪$VAR inclink : IncList; err : BOOLEAN;⓪$BEGIN⓪&NEW (inclink);⓪&IF inclink = NIL THEN termNoMem END;⓪&inclink^.next := actmod^.uses;⓪&actmod^.uses := inclink;⓪&Assign (name, inclink^.fullname, err);⓪$END newUse;⓪ ⓪"PROCEDURE newInc (name : ARRAY OF CHAR);⓪$VAR inclink : IncList; err : BOOLEAN;⓪$BEGIN⓪&NEW (inclink);⓪&IF inclink = NIL THEN termNoMem END;⓪&inclink^.next := actmod^.include;⓪&actmod^.include := inclink;⓪&Assign (name, inclink^.fullname, err);⓪$END newInc;⓪ ⓪"PROCEDURE newImport (VAR name: ARRAY OF CHAR);⓪$VAR implink: ImpList; impmod: PtrMod;⓪$BEGIN⓪&IF ~avail (name, def, impmod) THEN⓪(newMod (name, def, impmod);⓪&END;⓪&NEW (implink);⓪&implink^.next:= actmod^.import;⓪&implink^.modPtr := impmod;⓪&actmod^.import:= implink⓪$END newImport;⓪ ⓪"VAR actname, dummy: String;⓪(n: INTEGER;⓪(empty, firstMain, mainMod, mainImp, ignore: BOOLEAN;⓪(idNOSOURCE, idMAIN, idMOD, idDEF, idIMPMOD, idIMP,⓪(idNONE, idSOURCE, idINC, idUSES, idIMPORT: String;⓪(acttype: ModType;⓪(state: (ModOrType, waitModName, waitType, waitCodeName, waitSource,⓪0waitSourceName, waitInc, waitUseName, waitIncName, waitImport,⓪0waitImportName);⓪ ⓪"BEGIN (* readIdents *)⓪$SearchFile (makename, (*!TT*)SrcPaths, fromStart, ok, fname);⓪$Open (f, fname, readSeqTxt);⓪$checkState;⓪$TextLine:= 0;⓪$FastStrings.Assign (fname, TextName);⓪ ⓪$WriteLn;⓪$WriteString(readng);⓪$WriteString (fname);⓪ ⓪$idMOD:= '-MOD';⓪$idDEF:= '-DEF';⓪$idIMP:= '-IMP';⓪$idIMPMOD:= '-IMPMOD';⓪$idNONE:= '-IGNORE';⓪$idMAIN:= '-MAIN';⓪$idSOURCE:= '-SOURCE';⓪$idNOSOURCE:= '-NOSRC';⓪$idINC := '-INC';⓪$idUSES:= '-USES';⓪$idIMPORT:= '-IMPORT';⓪$⓪$TextCol:= 0; lineLen:= 0; line:= '';⓪$state:= waitModName;⓪$mainImp:= FALSE;⓪$firstMain:= TRUE;⓪$empty:= TRUE;⓪$(*$D-*)⓪$WHILE getIdent (id) DO⓪&empty:= FALSE;⓪&LOOP⓪(CASE state OF⓪*ModOrType:⓪,IF id [0] = '-' THEN⓪.state := waitType⓪,ELSE⓪.state := waitModName⓪,END |⓪*waitModName:⓪,IF id [0] = '-' THEN syntaxError (nameExp) END;⓪,mainMod:= FALSE;⓪,actname:= id; state:= waitType; EXIT |⓪*waitType:⓪,Upper (id);⓪,ignore:= FALSE;⓪,mainImp:= FALSE;⓪,IF StrEqual (id, idDEF) THEN⓪.acttype:= def;⓪,ELSIF StrEqual (id, idIMP) THEN⓪.acttype:= imp;⓪,ELSIF StrEqual (id, idMOD) THEN⓪.acttype:= mod⓪,ELSIF StrEqual (id, idIMPMOD) THEN⓪.acttype:= imp;⓪.mainImp:= TRUE⓪,ELSIF StrEqual (id, idNONE) THEN⓪.acttype:= def;⓪.ignore:= TRUE⓪,ELSIF StrEqual (id, idMAIN) THEN⓪.mainMod:= TRUE;⓪.state:= ModOrType;⓪.EXIT⓪,ELSE⓪.syntaxError (typeExp)⓪,END;⓪,IF avail (actname, acttype, actmod) THEN⓪.IF ~Empty (actmod^.codeName) THEN⓪0WriteLn;⓪0WriteString (actname);⓪0term (dblid)⓪.ELSIF ignore THEN⓪0actmod^.ignore:= TRUE⓪.END⓪,ELSE⓪.newMod (actname, acttype, actmod);⓪,END;⓪,IF ignore THEN⓪.state:= waitModName⓪,ELSE⓪.state:= waitCodeName⓪,END;⓪,EXIT |⓪*waitCodeName:⓪,IF id [0] = '-' THEN syntaxError (fileExp) END;⓪,ReplaceHome (id);⓪,actmod^.codeName:= id;⓪,IF mainMod & firstMain THEN⓪.firstMain:= FALSE;⓪.FastStrings.Assign (actmod^.name, ModuleName);⓪.FastStrings.Assign (actmod^.codeName, CodeName);⓪,END;⓪,state:= waitSource; EXIT |⓪*waitSource:⓪,IF StrEqual (id, idSOURCE) THEN⓪.actmod^.withSource:= TRUE; state:= waitSourceName; EXIT⓪,ELSIF StrEqual (id, idNOSOURCE) THEN⓪.actmod^.ignoreSource:= TRUE;⓪.IF acttype = mod THEN⓪0state:= waitModName⓪.ELSE⓪0state := ModOrType⓪.END;⓪.EXIT⓪,ELSE⓪.syntaxError (srcExp);⓪,END |⓪*waitSourceName:⓪,IF id [0] = '-' THEN syntaxError (srcnExp) END;⓪,ReplaceHome (id);⓪,actmod^.sourceName:= id;⓪,actmod^.include:= NIL;⓪,actmod^.uses:= NIL;⓪,actmod^.import:= NIL;⓪,IF NOT mainImp & (actmod^.type = imp) THEN⓪.(* eigenes Def-Modul importieren *)⓪.newImport (actname)⓪,END;⓪,state:= waitInc;⓪,EXIT |⓪*waitInc:⓪,IF StrEqual (id, idINC) THEN⓪.state:= waitIncName; EXIT⓪,ELSIF StrEqual (id, idUSES) THEN⓪.state:= waitUseName; EXIT⓪,ELSE⓪.state:= waitImport⓪,END; |⓪*waitIncName, waitUseName:⓪,IF id [0] = '-' THEN syntaxError (fileExp) END;⓪,n:= Pos (';', id, 0);⓪,IF n>=0 THEN (* Ende der Includes *)⓪.state := waitImport;⓪.IF n=0 THEN EXIT END;⓪.Copy (id, 0, n, id, ok)⓪,END;⓪,ReplaceHome (id);⓪,IF state = waitIncName THEN⓪.newInc (id)⓪,ELSE⓪.newUse (id)⓪,END;⓪,EXIT |⓪*waitImport:⓪,IF StrEqual (id, idIMPORT) THEN⓪.state:= waitImportName; EXIT⓪,ELSE⓪.IF acttype = mod THEN state:= waitModName⓪.ELSE state := ModOrType END;⓪,END |⓪*waitImportName:⓪,IF id [0] = '-' THEN syntaxError (nameExp) END;⓪,n:= Pos (';', id, 0);⓪,IF n>=0 THEN (* Ende der Importe *)⓪.IF acttype = mod THEN state:= waitModName⓪.ELSE state := ModOrType END;⓪.IF n=0 THEN EXIT END;⓪.Copy (id, 0, n, id, ok)⓪,END;⓪,newImport (id);⓪,EXIT |⓪(END (* CASE state OF *)⓪&END (* LOOP *)⓪$END; (* WHILE getIdent (id) *)⓪$(*$D-*)⓪$Close (f);⓪$IF empty THEN⓪&term3 (noFile)⓪$END⓪"END readIdents;⓪ ⓪ PROCEDURE verifyIdents (): BOOLEAN;⓪"VAR modPtr: PtrMod;⓪"BEGIN⓪$ResetList (modlist);⓪$LOOP⓪&modPtr:= NextEntry (modlist);⓪&IF modPtr = NIL THEN EXIT END;⓪&IF ~modPtr^.ignore & Empty (modPtr^.codeName) THEN⓪(WriteLn;⓪(WriteString (modPtr^.name);⓪(WriteString (notDef);⓪(waitAtEnd:= TRUE;⓪&END⓪$END;⓪$RETURN ~waitAtEnd⓪"END verifyIdents;⓪ ⓪ ⓪ PROCEDURE getFileDateTime (REF name: ARRAY OF CHAR;⓪;VAR date, time: CARDINAL): BOOLEAN;⓪"VAR f: File; entry: DirEntry; res: INTEGER;⓪"BEGIN⓪$GetDirEntry (name, entry, res);⓪$IF res >= 0 THEN⓪&date:= PackDate (entry.date);⓪&time:= PackTime (entry.time);⓪$END;⓪$RETURN res >= 0⓪"END getFileDateTime;⓪ ⓪ ⓪ PROCEDURE getTime (): BOOLEAN;⓪ ⓪ TYPE⓪"FileEntry = RECORD⓪0name : ARRAY [0..12] OF CHAR;⓪0modPtr : PtrMod;⓪.END;⓪"PtrFile = POINTER TO FileEntry;⓪"FullEntry = RECORD⓪0fullname : ARRAY [0..80] OF CHAR;⓪0modPtr : ADDRESS;⓪0typ : FileType;⓪.END;⓪"PtrFullEntry = POINTER TO FullEntry;⓪"⓪ VAR⓪"pmod: PtrMod;⓪"err: BOOLEAN;⓪"ModCodes : List; (* OF FileEntry *)⓪"DefCodes : List; (* OF FileEntry *)⓪"ImpCodes : List; (* OF FileEntry *)⓪"Sources : List; (* OF FileEntry *)⓪"Defaults : List; (* OF FileEntry *)⓪"withPath : List; (* OF FullEntry *)⓪ ⓪ ⓪"PROCEDURE insCode (REF name : ARRAY OF CHAR; type : ModType; pmod : PtrMod);⓪"VAR⓪$merr : BOOLEAN;⓪$Fentry : PtrFile;⓪$FullE : PtrFullEntry;⓪$path : ARRAY [0..127] OF CHAR;⓪$fname: ARRAY [0..12] OF CHAR;⓪"BEGIN⓪$SplitPath (name, path, fname);⓪$IF path[0] = 0C THEN⓪&NEW (Fentry);⓪&IF Fentry=NIL THEN termNoMem END;⓪&IF type = mod THEN⓪(AppendEntry (ModCodes, Fentry, merr);⓪&ELSIF type = def THEN⓪(AppendEntry (DefCodes, Fentry, merr);⓪&ELSIF type = imp THEN⓪(AppendEntry (ImpCodes, Fentry, merr);⓪&END;⓪&IF merr THEN termNoMem END;⓪&Assign (name, Fentry^.name, merr);⓪&Fentry^.modPtr := pmod;⓪$ELSE⓪&NEW (FullE);⓪&IF FullE = NIL THEN termNoMem END;⓪&AppendEntry (withPath, FullE, merr);⓪&IF merr THEN termNoMem END;⓪&Assign (name, FullE^.fullname, merr);⓪&FullE^.modPtr := pmod;⓪&FullE^.typ := type;⓪$END;⓪"END insCode;⓪"⓪"PROCEDURE insSource (REF name : ARRAY OF CHAR; type : ModType; pmod : PtrMod);⓪"VAR⓪$merr : BOOLEAN;⓪$Fentry : PtrFile;⓪$FullE : PtrFullEntry;⓪$path : ARRAY [0..80] OF CHAR;⓪$fname: ARRAY [0..12] OF CHAR;⓪$actinc : IncList;⓪"BEGIN⓪$SplitPath (name, path, fname);⓪$IF path[0]=0C THEN⓪&NEW (Fentry);⓪&IF Fentry = NIL THEN termNoMem END;⓪&AppendEntry (Sources, Fentry, merr);⓪&IF merr THEN termNoMem END;⓪&Assign (name, Fentry^.name, merr);⓪&Fentry^.modPtr := pmod;⓪$ELSE⓪&NEW (FullE);⓪&IF FullE = NIL THEN termNoMem END;⓪&AppendEntry (withPath, FullE, merr);⓪&IF merr THEN termNoMem END;⓪&Assign (name, FullE^.fullname, merr);⓪&FullE^.modPtr := pmod;⓪&FullE^.typ := src;⓪$END;⓪$(*!!! INC sollten, wenn kein Pfad angegeben, in 'Sources' eingetragen werden *)⓪$actinc := pmod^.include;⓪$WHILE (actinc <> NIL) DO⓪&NEW (FullE);⓪&AppendEntry (withPath, FullE, merr);⓪&IF merr THEN termNoMem END;⓪&Assign (actinc^.fullname, FullE^.fullname, merr);⓪&FullE^.modPtr := actinc;⓪&FullE^.typ := inc;⓪&actinc := actinc^.next;⓪$END;⓪$(*!!! USES sollten, wenn kein Pfad angegeben, in 'Defaults' eingetragen werden *)⓪$actinc := pmod^.uses;⓪$WHILE (actinc <> NIL) DO⓪&NEW (FullE);⓪&AppendEntry (withPath, FullE, merr);⓪&IF merr THEN termNoMem END;⓪&Assign (actinc^.fullname, FullE^.fullname, merr);⓪&FullE^.modPtr := actinc;⓪&FullE^.typ := uses;⓪&actinc := actinc^.next;⓪$END;⓪"END insSource;⓪ ⓪"PROCEDURE markToCompile (modPtr: PtrMod; name: ARRAY OF CHAR);⓪$BEGIN⓪&WITH modPtr^ DO⓪(date := 0;⓪(time := 0;⓪&END; (* WITH *)⓪$END markToCompile;⓪ ⓪ ⓪"PROCEDURE getModTimes();⓪"VAR⓪$PathPtr : PathEntry;⓪$FilePtr : PtrFile;⓪$path, cn : String;⓪$c: CHAR;⓪$ok, rerr : BOOLEAN;⓪"BEGIN⓪$ResetList(ModPaths);⓪$LOOP⓪&PathPtr := NextEntry(ModPaths);⓪&IF PathPtr = NIL THEN EXIT END;⓪&Assign (PathPtr^,path,ok);⓪&ValidatePath (path);⓪&ReplaceHome (path);⓪&ResetList(ModCodes);⓪&LOOP⓪(FilePtr := NextEntry (ModCodes);⓪(IF FilePtr = NIL THEN EXIT END;⓪(Concat (path, FilePtr^.name, cn, ok);⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.date, FilePtr^.modPtr^.time) THEN⓪*Assign (cn, FilePtr^.modPtr^.codeName, ok);⓪*RemoveEntry(ModCodes, rerr);⓪*IF rerr THEN term3 (remErr) END;⓪(END;⓪&END; (* FileLoop *)⓪&IF ListEmpty (ModCodes) THEN EXIT END;⓪$END; (* PathLoop *)⓪$IF ~ListEmpty(ModCodes) THEN⓪&ResetList(ModCodes);⓪&LOOP⓪(FilePtr := NextEntry(ModCodes);⓪(IF FilePtr = NIL THEN EXIT END;⓪(IF FilePtr^.modPtr^.withSource THEN⓪*markToCompile (FilePtr^.modPtr, FilePtr^.name);⓪(ELSE⓪*WriteLn;⓪*WriteString (FilePtr^.name);⓪*waitAtEnd:= TRUE⓪(END;⓪&END; (* LOOP *)⓪$END; (* IF ~ListEmpty *)⓪"END getModTimes;⓪"⓪"PROCEDURE getDefTimes();⓪"VAR⓪$PathPtr : PathEntry;⓪$FilePtr : PtrFile;⓪$path, cn : String;⓪$c: CHAR;⓪$ok, rerr : BOOLEAN;⓪"BEGIN⓪$ResetList(DefPaths);⓪$LOOP⓪&PathPtr := NextEntry(DefPaths);⓪&IF PathPtr = NIL THEN EXIT END;⓪&Assign (PathPtr^,path,ok);⓪&ValidatePath (path);⓪&ReplaceHome (path);⓪&ResetList(DefCodes);⓪&LOOP⓪(FilePtr := NextEntry (DefCodes);⓪(IF FilePtr = NIL THEN EXIT END;⓪(Concat (path, FilePtr^.name, cn, ok);⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.date, FilePtr^.modPtr^.time) THEN⓪*Assign (cn, FilePtr^.modPtr^.codeName, ok);⓪*RemoveEntry(DefCodes, rerr);⓪*IF rerr THEN term3 (remErr) END;⓪(END;⓪&END; (* FileLoop *)⓪&IF ListEmpty (DefCodes) THEN EXIT END;⓪$END; (* PathLoop *)⓪$IF ~ListEmpty(DefCodes) THEN⓪&ResetList(DefCodes);⓪&LOOP⓪(FilePtr := NextEntry(DefCodes);⓪(IF FilePtr = NIL THEN EXIT END;⓪(IF FilePtr^.modPtr^.withSource THEN⓪*markToCompile (FilePtr^.modPtr, FilePtr^.name);⓪(ELSE⓪*WriteLn;⓪*WriteString (FilePtr^.name);⓪*waitAtEnd:= TRUE⓪(END;⓪&END; (* LOOP *)⓪$END; (* IF ~ListEmpty *)⓪"END getDefTimes;⓪"⓪"PROCEDURE getImpTimes();⓪"VAR⓪$PathPtr : PathEntry;⓪$FilePtr : PtrFile;⓪$path, cn : String;⓪$c: CHAR;⓪$ok, rerr : BOOLEAN;⓪"BEGIN⓪$ResetList(ImpPaths);⓪$LOOP⓪&PathPtr := NextEntry(ImpPaths);⓪&IF PathPtr = NIL THEN EXIT END;⓪&Assign (PathPtr^,path,ok);⓪&ValidatePath (path);⓪&ReplaceHome (path);⓪&ResetList(ImpCodes);⓪&LOOP⓪(FilePtr := NextEntry (ImpCodes);⓪(IF FilePtr = NIL THEN EXIT END;⓪(Concat (path, FilePtr^.name, cn, ok);⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.date, FilePtr^.modPtr^.time) THEN⓪*Assign (cn, FilePtr^.modPtr^.codeName, ok);⓪*RemoveEntry(ImpCodes, rerr);⓪*IF rerr THEN term3 (remErr) END;⓪(END;⓪&END; (* FileLoop *)⓪&IF ListEmpty (ImpCodes) THEN EXIT END;⓪$END; (* PathLoop *)⓪$IF ~ListEmpty(ImpCodes) THEN⓪&ResetList(ImpCodes);⓪&LOOP⓪(FilePtr := NextEntry(ImpCodes);⓪(IF FilePtr = NIL THEN EXIT END;⓪(IF FilePtr^.modPtr^.withSource THEN⓪*markToCompile (FilePtr^.modPtr, FilePtr^.name);⓪(ELSE⓪*WriteLn;⓪*WriteString (FilePtr^.name);⓪*waitAtEnd:= TRUE⓪(END;⓪&END; (* LOOP *)⓪$END; (* IF ~ListEmpty *)⓪"END getImpTimes;⓪ ⓪"PROCEDURE getSrcTimes();⓪"VAR⓪$PathPtr : PathEntry;⓪$FilePtr : PtrFile;⓪$path, cn : String;⓪$ok, rerr : BOOLEAN;⓪"BEGIN⓪$ResetList(SrcPaths);⓪$LOOP⓪&PathPtr := NextEntry(SrcPaths);⓪&IF PathPtr = NIL THEN EXIT END;⓪&Assign (PathPtr^,path,ok);⓪&ValidatePath (path);⓪&ReplaceHome (path);⓪&ResetList(Sources);⓪&LOOP⓪(FilePtr := NextEntry (Sources);⓪(IF FilePtr = NIL THEN EXIT END;⓪(Concat (path, FilePtr^.name, cn, ok);⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.sdate, FilePtr^.modPtr^.stime) THEN⓪*Assign (cn, FilePtr^.modPtr^.sourceName, ok);(*!!!das trifft auf INC nicht zu?! *)⓪*RemoveEntry(Sources, rerr);⓪*IF rerr THEN term3 (remErr) END;⓪(END;⓪&END; (* FileLoop *)⓪&IF ListEmpty (Sources) THEN EXIT END;⓪$END; (* PathLoop *)⓪$IF ~ListEmpty(Sources) THEN⓪&ResetList(Sources);⓪&WriteLn;⓪&LOOP⓪(FilePtr := NextEntry(Sources);⓪(IF FilePtr = NIL THEN EXIT END;⓪(WriteString (FilePtr^.name);⓪(WriteLn;⓪&END; (* LOOP *)⓪&waitAtEnd:= TRUE⓪$END; (* IF ~ListEmpty *)⓪"END getSrcTimes;⓪ ⓪ (*!TT⓪"PROCEDURE getDftTimes();⓪"VAR⓪$PathPtr : PathEntry;⓪$FilePtr : PtrFile;⓪$paths : PathList;⓪$path, cn: String;⓪$ok, rerr: BOOLEAN;⓪"BEGIN⓪$paths:= StdPaths ();⓪$ResetList(paths);⓪$LOOP⓪&PathPtr := NextEntry(paths);⓪&IF PathPtr # NIL THEN Assign (PathPtr^,path,ok)⓪&ELSE EXIT END;⓪&ResetList(Defaults);⓪&LOOP⓪(FilePtr := NextEntry (Defaults);⓪(IF FilePtr = NIL THEN EXIT END;⓪(Concat (path, FilePtr^.name, cn, ok);⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.sdate, FilePtr^.modPtr^.stime) THEN⓪*Assign (cn, FilePtr^.modPtr^.sourceName, ok);(*!!!das trifft auf USES nicht zu?! *)⓪*RemoveEntry(Defaults, rerr);⓪*IF rerr THEN term3 (remErr) END;⓪(END;⓪&END; (* FileLoop *)⓪$END; (* PathLoop *)⓪$IF ~ListEmpty(Defaults) THEN⓪&ResetList(Defaults);⓪&WriteLn;⓪&LOOP⓪(FilePtr := NextEntry(Defaults);⓪(IF FilePtr = NIL THEN EXIT END;⓪(WriteString (FilePtr^.name);⓪(WriteLn;⓪&END; (* LOOP *)⓪&waitAtEnd:= TRUE⓪$END; (* IF ~ListEmpty *)⓪"END getDftTimes;⓪ *)⓪ ⓪"PROCEDURE getPathTimes();⓪"VAR⓪$FilePtr : PtrFullEntry;⓪$pmod : PtrMod;⓪$pinc : IncList;⓪$sdate, stime: CARDINAL;⓪$fname: FileStr;⓪$paths: PathList;⓪$c: CHAR;⓪$ok, rerr : BOOLEAN;⓪"BEGIN⓪$ResetList(withPath);⓪$LOOP⓪&FilePtr := NextEntry (withPath);⓪&IF FilePtr = NIL THEN EXIT END;⓪&WITH FilePtr^ DO⓪(⓪((*!TT:*)⓪(ok:= getFileDateTime (HomeReplaced (fullname), sdate, stime);⓪(IF NOT ok THEN⓪*IF typ = mod THEN⓪,paths:= ModPaths⓪*ELSIF typ = def THEN⓪,paths:= DefPaths⓪*ELSIF typ = imp THEN⓪,paths:= ImpPaths⓪*ELSE⓪,paths:= SrcPaths⓪*END;⓪*SearchFile (fullname, paths, fromStart, ok, fname);⓪*ok:= getFileDateTime (fname, sdate, stime);⓪(END;⓪(⓪(IF ok THEN⓪*IF typ = src THEN⓪,pmod := modPtr;⓪,pmod^.sdate:= sdate;⓪,pmod^.stime:= stime;⓪*ELSIF (typ = inc) OR (typ = uses) THEN⓪,pinc := modPtr;⓪,pinc^.date:= sdate;⓪,pinc^.time:= stime;⓪*ELSE⓪,pmod := modPtr;⓪,pmod^.date:= sdate;⓪,pmod^.time:= stime⓪*END;⓪*RemoveEntry(withPath, rerr);⓪*IF rerr THEN term3 (remErr) END;⓪(END; (* IF State *)⓪&END; (* WITH FilePtr *)⓪$END; (* FileLoop *)⓪$IF ~ListEmpty(withPath) THEN⓪&ResetList(withPath);⓪&LOOP⓪(FilePtr := NextEntry(withPath);⓪(IF FilePtr = NIL THEN EXIT END;⓪(pmod := FilePtr^.modPtr;⓪(IF (FilePtr^.typ < src) & pmod^.withSource THEN⓪*(* Wenn's ein Code mit Source ist, fehlenden Code übersetzen *)⓪*markToCompile (pmod, FilePtr^.fullname)⓪(ELSE⓪*(* Sonst fehlende Datei melden *)⓪*WriteLn;⓪*WriteString (FilePtr^.fullname);⓪*waitAtEnd:= TRUE⓪(END;⓪&END; (* LOOP *)⓪$END; (* IF ~ListEmpty *)⓪"END getPathTimes;⓪ ⓪ (*⓪"PROCEDURE showL (l : List; Titel : ARRAY OF CHAR);⓪"VAR FilePtr : PtrFile;⓪"BEGIN⓪$WriteString(Titel);⓪$WriteLn;⓪$ResetList(l);⓪$LOOP⓪&FilePtr := NextEntry (l);⓪&IF FilePtr = NIL THEN EXIT END;⓪&WriteString (FilePtr^.name);⓪&WriteLn;⓪$END;⓪$WriteLn;⓪$REPEAT UNTIL KeyPressed();⓪$FlushKbd();⓪"END showL;⓪"⓪"PROCEDURE showP (l : List; Titel : ARRAY OF CHAR);⓪"VAR FilePtr : PtrFullEntry;⓪"BEGIN⓪$WriteString(Titel);⓪$WriteLn;⓪$ResetList(l);⓪$LOOP⓪&FilePtr := NextEntry (l);⓪&IF FilePtr = NIL THEN EXIT END;⓪&WriteString (FilePtr^.fullname);⓪&WriteLn;⓪$END;⓪$WriteLn;⓪$REPEAT UNTIL KeyPressed();⓪$FlushKbd();⓪"END showP;⓪ *)⓪ ⓪"BEGIN⓪$WriteLn;⓪$WriteString(scanin);⓪$CreateList (ModCodes, error);⓪$IF error THEN termNoMem END;⓪$CreateList (DefCodes, error);⓪$IF error THEN termNoMem END;⓪$CreateList (ImpCodes, error);⓪$IF error THEN termNoMem END;⓪$CreateList (Sources, error);⓪$IF error THEN termNoMem END;⓪$CreateList (Defaults, error);⓪$IF error THEN termNoMem END;⓪$CreateList (withPath, error);⓪$IF error THEN termNoMem END;⓪$⓪$ResetList (modlist);⓪$LOOP⓪&pmod:= NextEntry (modlist);⓪&IF pmod = NIL THEN EXIT END;⓪&IF ~pmod^.ignore THEN⓪(IF Empty (pmod^.codeName) THEN⓪*HALT⓪*(* müßte schon bei 'verifyIdents' geprüft worden sein:⓪,WriteLn;⓪,WriteString (pmod^.name);⓪,WriteString (notDef);⓪,waitAtEnd:= TRUE;⓪**)⓪(ELSIF ~waitAtEnd THEN⓪*WITH pmod^ DO⓪,insCode (codeName, type, pmod);⓪,IF withSource THEN⓪.insSource (sourceName, type, pmod);⓪,END;⓪*END;⓪(END;⓪&END⓪$END;⓪$IF NOT waitAtEnd THEN⓪&(*⓪&showL(ModCodes, 'Mod:');⓪&showL(DefCodes, 'Def:');⓪&showL(ImpCodes, 'Imp:');⓪&showL(Sources, 'Src:');⓪&showL(Defaults, 'Src:');⓪&showP(withPath, 'Mit Pfad:');⓪&*)⓪&(*!!!⓪&getdefaultTimes();⓪&*)⓪&WriteLn;⓪&getModTimes();⓪&getDefTimes();⓪&getImpTimes();⓪&getSrcTimes();⓪&getPathTimes();⓪&WriteLn;⓪&IF waitAtEnd THEN⓪(term3 (opnErr)⓪&END⓪$END;⓪$RETURN ~waitAtEnd⓪"END getTime;⓪ ⓪ (*⓪ PROCEDURE showIdents;⓪"VAR modPtr: PtrMod; c: CHAR; i: ImpList; s: String;⓪"BEGIN⓪$ResetList (modlist);⓪$LOOP⓪&modPtr:= NextEntry (modlist);⓪&IF modPtr = NIL THEN EXIT END;⓪&WITH modPtr^ DO⓪(WriteLn;⓪(WriteString (name);⓪(WriteString (' ');⓪(IF type=def THEN WriteString ('DEF')⓪(ELSIF type=imp THEN WriteString ('IMP')⓪(ELSE WriteString ('MOD') END;⓪(WriteLn;⓪(WriteString ('Codename: ');⓪(WriteString (codeName);⓪(WriteString (' ');⓪(DateToText (UnpackDate (date), '', s);⓪(WriteString (s);⓪(WriteString (' ');⓪(TimeToText (UnpackTime (time), '', s);⓪(WriteString (s);⓪(IF withSource THEN⓪*WriteLn;⓪*WriteString ('Source: ');⓪*WriteString (sourceName);⓪*WriteString (' ');⓪*DateToText (UnpackDate (sdate), '', s);⓪*WriteString (s);⓪*WriteString (' ');⓪*TimeToText (UnpackTime (stime), '', s);⓪*WriteString (s);⓪*IF import # NIL THEN⓪,WriteLn;⓪,WriteString ('Imports: ');⓪,i:= import;⓪,LOOP⓪.WriteString (i^.modPtr^.name);⓪.i:= i^.next;⓪.IF i = NIL THEN EXIT END;⓪.WriteString (', ')⓪,END⓪*END (* IF import # NIL *)⓪(END; (* IF withSource *)⓪(WriteLn;⓪(Read (c);⓪&END (* WITH modPtr^ *)⓪$END; (* LOOP *)⓪"END showIdents;⓪ *)⓪ ⓪ PROCEDURE chkTree;⓪"VAR⓪$modPtr: PtrMod;⓪$cdate, ctime : CARDINAL;⓪$currtime: moment;⓪$success : BOOLEAN;⓪$mustCompile: BOOLEAN;⓪ ⓪"PROCEDURE toCompile (REF sourceName, codeName, clientName: ARRAY OF CHAR);⓪$VAR s, s2: String;⓪$BEGIN⓪&mustCompile:= TRUE;⓪&Text.WriteString (compfile, '(*$I ');⓪&Text.WriteString (compfile, sourceName);⓪&IF codeName[0] # '' THEN⓪(Text.WriteString (compfile, ' Code: ');⓪(SplitPath (codeName, s, s2);⓪(Text.WriteString (compfile, s)⓪&END;⓪&IF clientName[0] # '' THEN⓪(Text.WriteString (compfile, ' Reason: ');⓪(Text.WriteString (compfile, clientName)⓪&END;⓪&Text.WriteString (compfile, ' *)');⓪&Text.WriteLn (compfile);⓪$END toCompile;⓪ ⓪"PROCEDURE illegalSourceTime (REF sourceName: ARRAY OF CHAR);⓪$BEGIN⓪&WriteLn;⓪&WriteString (sourceName);⓪&WriteString (datErr);⓪&waitAtEnd:= TRUE⓪$END illegalSourceTime;⓪ ⓪"PROCEDURE illegalCodeTime (REF codeName: ARRAY OF CHAR);⓪$BEGIN⓪&WriteLn;⓪&WriteString (codeName);⓪&WriteString (datErr);⓪&waitAtEnd:= TRUE⓪$END illegalCodeTime;⓪ ⓪"PROCEDURE toMoment (date : CARDINAL; time : CARDINAL) : moment;⓪$BEGIN⓪&RETURN (LONG(time)+LONG(date)*$10000L);⓪$END toMoment;⓪ ⓪"PROCEDURE setTimeDate (time: moment; modPtr: PtrMod);⓪$BEGIN⓪&modPtr^.date:= SHORT (time DIV $10000);⓪&modPtr^.time:= SHORT (time MOD $10000);⓪$END setTimeDate;⓪ ⓪"PROCEDURE Lmax (a, b : LONGCARD) : LONGCARD;⓪$BEGIN⓪&IF a>b THEN RETURN a⓪&ELSE RETURN b END;⓪$END Lmax;⓪ ⓪"PROCEDURE chkDate(aktmod : PtrMod) : moment;⓪$VAR⓪&clientName: String;⓪&aktimp: ImpList;⓪&this, maximp, codeMom, sourceMom: moment;⓪ ⓪$PROCEDURE check (aktinc: IncList);⓪&VAR incTime: moment;⓪&BEGIN⓪(WHILE (aktinc <> NIL) DO⓪*incTime:= toMoment(aktinc^.date, aktinc^.time);⓪*IF incTime > sourceMom THEN⓪,sourceMom:= incTime;⓪,IF (sourceMom > codeMom) & (clientName[0] = '') THEN⓪.Assign (aktinc^.fullname, clientName, ok)⓪,END⓪*END;⓪*aktinc := aktinc^.next;⓪(END⓪&END check;⓪ ⓪$BEGIN⓪&codeMom:= 0;⓪&clientName:= '';⓪&WITH aktmod^ DO⓪(IF NOT ignore THEN⓪*IF build THEN⓪,codeMom:= 0⓪*ELSE⓪,codeMom:= toMoment(date, time);⓪*END;⓪*IF NOT checked THEN⓪,checked:= TRUE;⓪,IF codeMom > currtime THEN illegalCodeTime (codeName) END;⓪,IF withSource THEN⓪.IF build THEN⓪0sourceMom:= 0⓪.ELSE⓪0sourceMom:= toMoment(sdate, stime);⓪.END;⓪.IF sourceMom > currtime THEN illegalSourceTime (sourceName) END;⓪.IF NOT build THEN⓪0IF sourceMom > codeMom THEN⓪2IF codeMom = 0 THEN⓪4clientName:= NoCodeMsg⓪2ELSE⓪4clientName:= SelfMsg⓪2END⓪0END;⓪0check (include);⓪0check (uses);⓪.END;⓪.maximp:= 0L;⓪.aktimp:= import;⓪.WHILE aktimp <> NIL DO⓪0this:= chkDate(aktimp^.modPtr);⓪0IF this > maximp THEN⓪2maximp:= this;⓪2IF (maximp > codeMom) & (sourceMom <= codeMom) THEN⓪4Assign (aktimp^.modPtr^.codeName, clientName, ok)⓪2END⓪0END;⓪0aktimp:= aktimp^.next;⓪.END; (* WHILE *)⓪.IF build OR (buildImp & (type # def))⓪.OR (maximp>codeMom) OR (sourceMom>codeMom) THEN⓪0IF build THEN clientName:= '' END;⓪0toCompile (sourceName, codeName, clientName);⓪0codeMom:= currtime;⓪0setTimeDate (codeMom, aktmod);⓪.END;⓪,END; (* IF withSource *)⓪*END; (* IF NOT checked *)⓪(END; (* IF NOT ignore *)⓪&END; (* WITH *)⓪&RETURN codeMom;⓪$END chkDate;⓪ ⓪"VAR cn: String; ok: BOOLEAN; ml: List; dummy: moment;⓪ ⓪"BEGIN⓪$WriteLn;⓪$⓪$ctime:= PackTime(CurrentTime());⓪$cdate:= PackDate(CurrentDate());⓪$currtime:= toMoment(cdate, ctime);⓪ ⓪$ConcatPath (HomeReplaced (TemporaryPath), compFileName, cn);⓪$Create(compfile, cn, writeSeqTxt, replaceOld);⓪$IF State(compfile)<0 THEN term3 (noCom) END;⓪ ⓪$ml:= modlist;⓪$ResetList (ml);⓪$mustCompile:= FALSE;⓪$LOOP⓪&modPtr:= NextEntry (ml);⓪&IF modPtr = NIL THEN EXIT END;⓪&IF NOT modPtr^.checked THEN⓪(dummy:= chkDate (modPtr)⓪&END⓪$END;⓪ ⓪$IF waitAtEnd THEN⓪&Remove (compfile)⓪$ELSIF mustCompile THEN⓪&exitCode:= 0;⓪&WriteString (toComp);⓪&Close (compfile);⓪$ELSE⓪&exitCode:= 1;⓪&WriteString (noComp);⓪&Remove (compfile);⓪$END;⓪ ⓪"END chkTree;⓪ ⓪ ⓪ VAR ch: CHAR;⓪$n, i, argc: CARDINAL;⓪$opts: String;⓪$argv: ARRAY [0..1] OF PtrArgStr;⓪ ⓪ BEGIN⓪"WriteLn;⓪"WriteString (titl1);⓪"WriteLn;⓪"WriteString (titl2);⓪"WriteLn;⓪ ⓪"HomePath:= ShellPath;⓪ ⓪"CodeName:= '';⓪"ModuleName:= '';⓪ ⓪"CreateList (modlist, error);⓪"IF error THEN termNoMem END;⓪ ⓪"(* MAKE-Datei einlesen, Daten in 'modlist' einfügen *)⓪"build:= FALSE;⓪"buildImp:= FALSE;⓪"InitArgCV (argc, argv);⓪"n:= 1; (* mögl. Pos. des Filenamens *)⓪"FOR i:= 1 TO argc-1 DO⓪$Upper (argv[i]^);⓪$IF StrEqual ('-B', argv[i]^) THEN⓪&IF i = 1 THEN n:= 2 (* neue mögl. Pos. des Filenamens *) END;⓪&build:= TRUE⓪$ELSIF StrEqual ('-BI', argv[i]^) THEN⓪&IF i = 1 THEN n:= 2 (* neue mögl. Pos. des Filenamens *) END;⓪&buildImp:= TRUE⓪$END⓪"END;⓪"IF argc > n THEN⓪$readIdents (argv[n]^)⓪"ELSE⓪$Upper (MakeFileName);⓪$EatSpaces (MakeFileName);⓪$(* Prüfen, ob "-B" am Anfang steht *)⓪$IF StrEqual ("-B", FuncStrings.CopyStr (MakeFileName, 0, 2)) THEN⓪&IF StrEqual ("-BI", FuncStrings.CopyStr (MakeFileName, 0, 3)) THEN⓪(buildImp:= TRUE;⓪&ELSE⓪(build:= TRUE;⓪&END;⓪&Delete (MakeFileName, 0, 2, ok);⓪$ELSE⓪&Split (MakeFileName,⓪-PosLen ("-", MakeFileName, 0),⓪-MakeFileName, opts, ok);⓪&IF StrEqual ("-B", opts) THEN⓪(build:= TRUE⓪&ELSIF StrEqual ("-BI", opts) THEN⓪(buildImp:= TRUE⓪&END⓪$END;⓪$readIdents (MakeFileName)⓪"END;⓪ ⓪"exitCode:= -1;⓪"waitAtEnd:= FALSE;⓪ ⓪"IF verifyIdents () THEN⓪$IF build OR getTime () THEN⓪&(*showIdents;*)⓪&chkTree;⓪$END⓪"END;⓪ ⓪"IF waitAtEnd THEN⓪$term3 ('')⓪"ELSE⓪$TermProcess (exitCode)⓪"END⓪ END MM2Make.⓪ ə
- (* $FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$00009A3E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9EÇ$000028C8T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00008F32$FFF0CEDA$00001D90$00001EB8$00001E70$00001E78$00001EB5$00008CF5$00008D61$00008CA8$000028C8$00009A3E$00008833$0000913B$00008F46$00008DB1¼Çé*)
-